﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Projeto3D
{
    class Level : SceneBase
    {
        public Objeto2D paused;
        public Fundo fundo;
        public Camera3D camera;
        public Personagem3D personagem;
        public ItensManager itensManager;
        public InimigoManager inimigoManager;
        public TiroManager tiroManager;
        InputController input;
        bool pause;
        public KeyboardState teclado;

        int possibilidade;
        int requerimento;//porcentagem requerida para criar o inimigo
        int dropar;
        Random random;

        private Song song;
        private SoundEffect effect;
        private List<Tiro> tiroToRemoveList;
        private List<Inimigo> inimigoToRemoveList;
        private List<Itens> itensToRemoveList;
        private int life;
        private Vector3 oldPersonagemPosition;

        private double time;
        private double timeToRespaw;

        public override void start()
        {
            random = new Random();
            pause = false;
            this.camera = new Camera3D();

           

            this.personagem = new Personagem3D(Game1.self.Content.Load<Model>("personagem"));
            this.tiroManager = new TiroManager();
            this.inimigoManager = new InimigoManager(Game1.self.Content.Load<Model>("alien"));
            itensManager = new ItensManager(Game1.self.Content.Load<Model>("personagem"));
            paused = new Objeto2D(Game1.self.Content.Load<Texture2D>("pause"));
            paused.posicao = new Vector2(320, 200);
            life = 5;

            //song = (Game1.self.Content.Load<Song>("musica"));// CARREGADOR DE SOM
            //effect = (Game1.self.Content.Load<SoundEffect>("musica"));// CARREGADOR DE EFEITOS SONOROS

            //MediaPlayer.Play(song); // o PLAYER DE AUDIO DO JOGO EXECUTARÁ A VARIAVEL SONG;
            //MediaPlayer.IsRepeating = true; // O PLAYER IRA SEMPRE SE REPETIR;
            this.input = new InputController();

            fundo = new Fundo(Game1.self.Content.Load<Texture2D>("grass")); 
            this.tiroToRemoveList = new List<Tiro>();
            this.inimigoToRemoveList = new List<Inimigo>();
            this.itensToRemoveList = new List<Itens>();
            this.oldPersonagemPosition = new Vector3();

            time = Time.milliseconds;
            timeToRespaw = Time.seconds;
        }

        public override void terminate()
        {
            this.personagem = null;
            this.camera = null;
            this.tiroManager = null;
            this.input = null;

            Game1.self.IsMouseVisible = false;
            MediaPlayer.Stop();
        }

        public override void draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Begin();
            fundo.Draw(spriteBatch);
            Pontuacao.Draw(spriteBatch, this.life);
            spriteBatch.End();

            this.itensManager.Draw(camera);
            if (personagem != null)
                this.personagem.draw(camera);
            

            this.inimigoManager.draw(camera);
            this.tiroManager.draw(camera);
        }

        public override void update(GameTime gameTime)
        {
            Time.update(gameTime, false);
           // if (!pause)
            {
                this.input.getState();
                teclado = Keyboard.GetState();

                if (personagem == null && Time.seconds - timeToRespaw > 2) //segundos para respaw
                {
                    personagem = new Personagem3D(Game1.self.Content.Load<Model>("personagem"));
                    personagem.position = oldPersonagemPosition;
                }

                Vector2 speed = new Vector2();

                if (personagem != null)
                    speed = personagem.update(gameTime, camera);
                
                inimigoManager.update(personagem);
                tiroManager.update();

                Game1.self.Window.Title = camera.lookAt.ToString();

                if (personagem != null && (personagem.position.X > -76 && personagem.position.X < 68) && (personagem.position.Z > -83 && personagem.position.Z < 82))
                {
                    fundo.update(speed);
                    camera.lookAt = personagem.position;
                    camera.position = personagem.position + new Vector3(0, 45, 1);
                }
                else if (personagem != null && personagem.position.X > -76 && personagem.position.X < 68)
                {
                    speed.Y = 0;
                    fundo.update(speed);
                    camera.lookAt.X = personagem.position.X;
                    camera.position.X = personagem.position.X;
                }
                else if (personagem != null && personagem.position.Z > -83 && personagem.position.Z < 82)
                {
                    speed.X = 0;
                    fundo.update(speed);
                    camera.lookAt.Z = personagem.position.Z;
                    camera.position.Z = personagem.position.Z + 1;
                }

 				if (personagem != null && input.mouse.LeftButton == ButtonState.Pressed)
                {
                    if (time <= Time.milliseconds - tiroManager.delayTiroMillisec)
                    {
                        tiroManager.createTiro(Tiro.Tipo.Normal, this.personagem.position, this.input.mouse, camera);
                        time = Time.milliseconds;
                    }
                }

                if (Time.seconds >= 35 && Time.seconds <= 45)
                {
                    requerimento = 91;

                }

                else if (Time.seconds >= 76 && Time.seconds <= 115)
                {
                    requerimento = 91;

                }

                else
                {
                    requerimento = 98;
                }

                possibilidade = random.Next(1, 100);
				// p = rnd.Next(1, 100);

                if (personagem != null && possibilidade >= requerimento)
                {
                    int px, py;
                    while ((px = random.Next(-30, 30)) < 5 && px > -5) ;
                    while ((py = random.Next(-30, 30)) < 5 && py > -5) ;
                    inimigoManager.addInimigo(new Vector3(personagem.position.X - px, 1, personagem.position.Z - py));
                }
                if (Time.seconds <= 202.8f)
                {
                    //Fim de jogo!
                }
                
                foreach (Inimigo inimigo in inimigoManager.listaInimigo)
                {
                    if (personagem != null && personagem.hitTestObject(inimigo))
                    {
                        inimigoToRemoveList.Add(inimigo);
                        life--;

                        this.timeToRespaw = Time.seconds;
                        this.oldPersonagemPosition = personagem.position;
                        personagem = null;
                    }

                    foreach (Tiro tiro in tiroManager.tiroList)
                    {
                        random = new Random();
                        if (tiro.hitTestObject(inimigo))
                        {
                            
                            int dropar = random.Next(0, 100);

                            if (dropar == 90)
                            {
                                itensManager.update(gameTime, inimigo.position.X, inimigo.position.Z);
                            } 
                            inimigoToRemoveList.Add(inimigo);
                            tiroToRemoveList.Add(tiro);
                            Pontuacao.Ganharpontos(1);
                            Console.WriteLine(dropar);
                        }
                    }
                }

                foreach (Itens item in itensManager.listaItens)
                {
                    if(personagem != null && personagem.hitTestObject(item))
                    {
                        life++;
                        this.itensToRemoveList.Add(item);
                        
                    }
                }

                foreach (Itens item in itensToRemoveList)
                {
                    itensManager.listaItens.Remove(item);
                }

                foreach (Tiro tiro in tiroToRemoveList)
                {
                    tiroManager.tiroList.Remove(tiro);
                }

                foreach (Inimigo inimigo in inimigoToRemoveList)
                {
                    inimigoManager.listaInimigo.Remove(inimigo);
                }

                if (this.input.isKeyJustPressed(Keys.Escape) || this.life == 0)
                {
                    SceneManager.setScene(new Menu()); // comando para finalizar a execução do programa, função exit;
                }

                


            }
        }
    }
}
